package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.PermissionDao;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.dao.UserDao;

import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.pojo.Menu;
import com.itheima.health.pojo.Permission;
import com.itheima.health.pojo.Role;
import com.itheima.health.pojo.User;
import com.itheima.health.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Author likepei
 * @Date 2020/3/26 2:51
 * @Version v1.0
 * @Description 用户业务接口实现类
 */
@Service
public class UserServiceImpl implements UserService {

    //依赖注入
    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private PermissionDao permissionDao;


    /**
     * 基于用户名 获取User对象
     * @param username
     * @return
     */
    @Override
    public User findByUsername(String username) {
        //通过 用户名获取用户信息
        User user = userDao.findByUsername(username);
        //通过 用户名id  获取所关联的角色集合
        Set<Role> roleSet = roleDao.findByUserId(user.getId());
        user.setRoles(roleSet);
        //通过 每一个角色id  获取所关联的权限集合
        for (Role role : roleSet) {
            Set<Permission> permissionSet = permissionDao.findByRoleId(role.getId());
           //获取所关联的菜单的集合
            role.setPermissions(permissionSet);
        }




        return user;
    }

    @Override
    public boolean login(String username, String password) {
        System.out.println("service_provide=======u:" + username + " p:" + password);
        if ("admin".equals(username) && "123".equals(password)){
            return true;
        }
        return false;
    }

    /*
    * 分页查询
    * */
    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        //设置分页插件初始参数
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //通过Dao获取Page对象
        Page<User> page = userDao.selectByCondition(queryPageBean.getQueryString());
        //通过Page对象，构建PageResult
        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());

        return pageResult;
    }

    /*
    * 获取所有角色
    * */
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    /*
    * 添加用户
    * */
    @Override
    public void add(User user, Integer[] roleIds) {


        //保存新增的用户信息

        userDao.add(user);

        //保存新增用户 与 勾选的角色 , 保存到中间表里 t_user_role
        //遍历角色Id的数组, 得到每一个角色id
        for (Integer roleId : roleIds) {
            //创建Map集合 用于存储本次sql语句的 新增检查组id 与 当前的检查项Id
            Map<String, Integer> map = new HashMap<>();
            map.put("user_id", user.getId());
            map.put("role_id", roleId);

            //把新增用户id 与 当前的角色Id 保存到中间表
            userDao.addUserAndrole(map);
        }
    }

    /*
    * 根据ID获取用户数据
    * */
    @Override
    public User findById(Integer id) {
        return userDao.findById(id);
    }

    /*
    * 根据用户ID获取选中的角色列表
    * */
    @Override
    public List<Integer> findRoleIdsByUserId(Integer id) {
        return userDao.findRoleIdsByUserId(id);
    }

    /*
    * 编辑用户
    * */
    @Override
    public void edit(User user, Integer[] roleIds) {
        //更新检查组信息
        userDao.edit(user);
        //删除用户 旧的依赖关系( 用户与勾选的角色的关系 [从中间表删除数据] )
        userDao.deleteUserAndRole(user.getId());
        //重新 建立新的检查组的依赖关系( 检查组与勾选的检查项的关系[从中间表添加数据] )
        for (Integer roleId : roleIds) {
            //建立Map集合, 用于保存每一次sql执行时 用到的 检查组ID与 检查项ID
            Map<String, Integer> map = new HashMap<>();
            map.put("user_id", user.getId());
            map.put("role_id", roleId);

            userDao.addUserAndrole(map);
        }
    }

    @Override
    public List<Menu> getMenuList(String username) {
        /*根据用户名查询对应角色信息ID*/
        List<Integer> roleIds = userDao.getRoleId(username);

        /*根据角色id查询中间表菜单id*/
        List<Integer> MenuId = userDao.findRoleAndMenuId(roleIds);

        /*根据菜单id查询对应的主菜单菜单数据*/
        List<Menu> menuList = userDao.getMenuList(MenuId);

        /*根据主菜单id查询子菜单*/
        for (Menu menu : menuList) {
            /**/
            List<Menu> children = userDao.getChildren(menu.getId());
            menu.setChildren(children);
        }
        /*返回对象*/
        return menuList;
    }

    /*
    * 删除用户
    * */
    @Override
    public void delete(Integer id) {
        //判断当前用户 在中间表中 是否被引用
        int count = userDao.findCountInuserAndrole(id);
        if (count > 0) {
            throw new RuntimeException("该用户在中间表中引用  不能删除");
        }

        userDao.delete(id);
    }

}
